package config;

import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;
import java.sql.SQLException;

/**
 * Created by 张少昆 on 2017/12/25.
 */
@Configuration
@PropertySource( "classpath:application.properties" ) //由每个模块提供
public class DataSourceConfig {
    private Logger logger = LoggerFactory.getLogger(DataSourceConfig.class);


    @Value( "${spring.datasource.url}" )
    private String dbUrl;

    @Value( "${spring.datasource.username}" )
    private String username;

    @Value( "${spring.datasource.password}" )
    private String password;

    @Value( "${spring.datasource.driver-class-name}" )
    private String driverClassName;

    @Value( "${spring.datasource.initialSize}" )
    private int initialSize;

    @Value( "${spring.datasource.minIdle}" )
    private int minIdle;

    @Value( "${spring.datasource.maxActive}" )
    private int maxActive;

    @Value( "${spring.datasource.maxWait}" )
    private int maxWait;

    @Value( "${spring.datasource.timeBetweenEvictionRunsMillis}" )
    private int timeBetweenEvictionRunsMillis;

    @Value( "${spring.datasource.minEvictableIdleTimeMillis}" )
    private int minEvictableIdleTimeMillis;

    @Value( "${spring.datasource.validationQuery}" )
    private String validationQuery;

    @Value( "${spring.datasource.testWhileIdle}" )
    private boolean testWhileIdle;

    @Value( "${spring.datasource.testOnBorrow}" )
    private boolean testOnBorrow;

    @Value( "${spring.datasource.testOnReturn}" )
    private boolean testOnReturn;

    @Value( "${spring.datasource.filters}" )
    private String filters;

    @Value( "${spring.datasource.logSlowSql}" )
    private String logSlowSql;

    // 下面这两个方法是spring boot中的，现在放到WebInitializer中了。
//    @Bean
//    public ServletRegistrationBean druidServlet(){
//        ServletRegistrationBean reg = new ServletRegistrationBean();
//        reg.setServlet(new StatViewServlet());
//        reg.addUrlMappings("/druid/*");
//        reg.addInitParameter("loginUsername", username);
//        reg.addInitParameter("loginPassword", password);
//        reg.addInitParameter("logSlowSql", logSlowSql);
//        return reg;
//    }
//
//    @Bean
//    public FilterRegistrationBean filterRegistrationBean(){
//        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
//        filterRegistrationBean.setFilter(new WebStatFilter());
//        filterRegistrationBean.addUrlPatterns("/*");
//        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
//        filterRegistrationBean.addInitParameter("profileEnable", "true");
//        return filterRegistrationBean;
//    }

    @Bean
    public DataSource druidDataSource(){
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        datasource.setInitialSize(initialSize);
        datasource.setMinIdle(minIdle);
        datasource.setMaxActive(maxActive);
        datasource.setMaxWait(maxWait);
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setValidationQuery(validationQuery);
        datasource.setTestWhileIdle(testWhileIdle);
        datasource.setTestOnBorrow(testOnBorrow);
        datasource.setTestOnReturn(testOnReturn);
        try{
            datasource.setFilters(filters);
        } catch(SQLException e){
            logger.error("druid configuration initialization filter", e);
        }
        return datasource;
    }

}
